﻿#include <iostream>

class Fraction
{
public:
	explicit Fraction(int num, int den = 1)
		:m_numerator(num), m_denominator(den) {}
	operator double() const {
		/*
			operator：为转换函数的操作符
			double(): 为转换函数的返回类型以及转出类型
			const： 函数返回的结果不应该被修改
		*/
		std::cout << __FUNCTION__ << (m_numerator / (double)m_denominator) << std::endl;
		return (m_numerator / (double)m_denominator);
	}

	Fraction operator+(const Fraction& f)
	{
		return Fraction(m_numerator + f.m_numerator,
			m_denominator + f.m_denominator);
	}
private:
	int m_numerator;
	int m_denominator;
};

int main(void)
{
	Fraction f(3, 5);
	double d = 4 + f;//编译器首先寻找有没有Fraction对应的加号重载函数，然后去寻找有没有Fraction 的转换函数
	std::cout << 4 + f << std::endl;

	Fraction d3 = f + Fraction(3);
	/*
		Fraction d2 = f + 2; //Error:ambiguous
	
		编译器会将2 转换为Fraction，返回调用 operator+ 函数。
			也可以将f 转换为double ，d2 = 0.6+2 , 会调用 Fraction(int num, int den = 1) 函数。
		所以就出现了二义性。
		explicit 可以解决这种问题，避免编译器自动将 2 转换为 Fraction。
	*/
}